{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "43353881-6b17-4132-a09d-d87900a716ae",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "b5e87951-ba7a-420f-b9e5-5aed1daf7edd",
   "metadata": {},
   "outputs": [],
   "source": [
    "def sigmoid(X):\n",
    "    mask_le0 = (X >= 0)\n",
    "    mask_s0 = (X < 0)\n",
    "    #大于0的部分使用原公式\n",
    "    Y1 = 1 / (1 + np.exp(-X * mask_le0))\n",
    "    #小于0部分使用e^x / (1 + e^x)\n",
    "    temp = np.exp(X * mask_s0)\n",
    "    Y2 = temp / (1 + temp)\n",
    "    return Y1 * mask_le0 + Y2 * mask_s0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "f062e7f3-bb79-409f-8444-e52c6ba32670",
   "metadata": {},
   "outputs": [],
   "source": [
    "def GD(X, Y, lr=0.05, l=0.1, echos=1000000):\n",
    "    #初始化参数\n",
    "    W = np.random.rand(X.shape[1], 1)\n",
    "    W_rule = np.random.rand(X.shape[1], 1)\n",
    "    #设置梯度变化量阈值\n",
    "    threshold = 1e-7\n",
    "    dW = 1\n",
    "    dW_rule = 1\n",
    "    \n",
    "    counts = 0\n",
    "    while np.average(dW) > threshold and counts < echos:\n",
    "        #计算估计值\n",
    "        Y_hat = sigmoid(X.dot(W))\n",
    "        #计算梯度\n",
    "        dW = X.T.dot(Y_hat - Y)\n",
    "        #更新参数\n",
    "        W -= lr * dW\n",
    "        #计数器加一\n",
    "        counts += 1\n",
    "    \n",
    "    counts = 0\n",
    "    while np.average(dW_rule) > threshold and counts < echos:\n",
    "        #计算估计值\n",
    "        Y_hat = sigmoid(X.dot(W_rule))\n",
    "        #计算梯度\n",
    "        dW_rule = X.T.dot(Y_hat - Y) + l * W_rule\n",
    "        #更新参数\n",
    "        W_rule -= lr * dW_rule\n",
    "        #计数器加一\n",
    "        counts += 1\n",
    "    \n",
    "    return W, W_rule"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "defaae57-58f3-4002-a223-a4398cf5bc1b",
   "metadata": {},
   "outputs": [],
   "source": [
    "def Newton(X, Y, l=0.1, echos=100000):\n",
    "    W = np.random.rand(X.shape[1], 1)\n",
    "    W_rule = np.random.rand(X.shape[1], 1)\n",
    "    threshold = 1e-9\n",
    "    U = 1\n",
    "    E = np.eye(Y.shape[0])\n",
    "    e = np.eye(X.shape[1]) * l\n",
    "    count = 0\n",
    "    \n",
    "    while np.average(U) > threshold and count < echos:\n",
    "        Y_hat = sigmoid(X.dot(W))\n",
    "        U = X.T.dot(Y - Y_hat)\n",
    "        A = E * (Y * Y_hat)\n",
    "        H = X.T.dot(A).dot(X)\n",
    "        \n",
    "        W += np.linalg.inv(H).dot(U)\n",
    "        count += 1\n",
    "    \n",
    "    count = 0\n",
    "    U = 1\n",
    "    while np.average(U) > threshold and count < echos:\n",
    "        Y_hat = sigmoid(X.dot(W))\n",
    "        U = X.T.dot(Y - Y_hat) + l * W\n",
    "        A = E * (Y * Y_hat)\n",
    "        H = X.T.dot(A).dot(X) + e\n",
    "        \n",
    "        W_rule += np.linalg.inv(H).dot(U)\n",
    "        count += 1\n",
    "        \n",
    "    return W, W_rule"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "2d782125-0acd-40b5-89cd-d549961d0943",
   "metadata": {},
   "outputs": [],
   "source": [
    "mu1 = np.array([2, 2])\n",
    "mu2 = np.array([-2, -2])\n",
    "#sigema = np.array([[1, 0], [0, 1]])\n",
    "sigema = np.array([[1, 0.9], [0.9, 1]])\n",
    "n = 120\n",
    "X = []\n",
    "Y = []\n",
    "X_0 = []\n",
    "X_1 = []\n",
    "#生成第一个维度均值为mu1，第二个维度均值为mu2，协方差矩阵为sigema的数据\n",
    "for _ in range(n):\n",
    "    flag = np.random.rand() >= 0.5\n",
    "    x = np.random.multivariate_normal(mu1 if flag else mu2, sigema)\n",
    "    #x = np.random.uniform(low=-3 if flag else 0, high=0 if flag else 3, size=(2,))\n",
    "    X.append([1] + list(x))\n",
    "    Y.append(int(flag))\n",
    "    if flag:\n",
    "        X_0.append(x)\n",
    "    else:\n",
    "        X_1.append(x)\n",
    "X = np.array(X)\n",
    "Y = np.array(Y).reshape(len(Y), 1)\n",
    "X_0 = np.array(X_0)\n",
    "X_1 = np.array(X_1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "d7892f83-7c8b-4dc5-8852-987522da614c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXIAAAD4CAYAAADxeG0DAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAAfvElEQVR4nO3df2xlZZkH8O/TAisFmYEygsvQ1j+ICSFOtY2FEBeWVRlHw0Tjz60uuGabNTLtABujaZZWzSQa4kynqNmd9ceStKsxUSKiG4UVlsTADB0dyOCMu8TYAXYJw8DAkjHK9D77x3tf7nvPfc+559x7ft5+P8lNe07PPeftKM99+7zP+76iqiAiourqK7oBRETUHQZyIqKKYyAnIqo4BnIioopjICciqrgzinjohRdeqCMjI0U8moiosg4ePPi8qm4Kni8kkI+MjGBlZaWIRxMRVZaIrPrOM7VCRFRxDORERBXHQE5EVHEM5EREFcdATkRUcakFchHpF5Ffi8i9ad2TiKhXLC8DIyNAX5/5uryc3r3TLD+cAXAEwHkp3pOIqPKWl4GpKeDUKXO8umqOAWBysvv7p9IjF5HNAN4L4Jtp3I+IqJfMzjaCuHXqlDmfhrRSKwsAPgugFnaBiEyJyIqIrBw/fjylxxIRld+xY8nOJ9V1IBeR9wF4TlUPRl2nqvtUdVxVxzdtaplhSkTUs4aGkp1PKo0e+dUAbhCR3wP4HoDrRGQphfsSEfWEXbuAgYHmcwMD5nwaug7kqvp5Vd2sqiMAPgrgF6r68a5bRkSUoyyrSiYngX37gOFhQMR83bcvnYFOoKBFs4iIyiTrqhJ7n7TuFSRFbL48Pj6uXP2QiMpiZMQE76DhYeD3v8+7NeFE5KCqjgfPc2YnEa17WVeVZI2BnIjWvayrSrLGQE5EPaWTQcusq0qyxkBORD3DDlqurgKqjUHLdsE866qSrDGQE1HP6GYq/OSkGdis1czXqCCeZaliJ1h+SEQ9I49ByzxKFZNij5yIekYeg5ZZL4DVCQZyIuoZeQxalrFUkYGciHpGHoOWZSxVZCAnop6SZNCyE2UsVWQgJyJKoIyliqxaISJKKMsFsDrBHjkRUcUxkBMRVRwDORFRxTGQExHFVLap+RYHO4mIYijj1Hyr6x65iLxORA6IyGMi8oSIfCGNhhERlUkZp+ZbaaRW/gjgOlXdAmAUwFYRuTKF+xIRFcpNpfi2ggPKsYtQ14FcjVfqh2fWX/lvBEpElFBUzju4tnmYMuwilMpgp4j0i8ghAM8BuE9V93uumRKRFRFZOX78eBqPJSLqWLtNKHyplKCBAWDbtugPgzwGR0WjPmqS3kxkI4C7AexQ1cNh142Pj+vKykpqzyUiSmpkxJ8uGR42a7T09YX3xEVMT3zbNuCuu5oD/sCAmbIPNA+Ouj/rdHBURA6q6njwfKrlh6p6EsADALameV8iWl/y6Mm2W442LGUyPNxYkOunPw0fAM1zcDSNqpVN9Z44RORsAO8CcLTb+xLR+tTpvpvu++N8CLRbjjbOKodRHwZ5rlueRo/8jQAeEJHHATwKkyO/N4X7EtE61E1PNsmHQLtAHWeVw6gPgzzXLU81Rx4Xc+REFCYsNy1iUhpR2uW9g5aXzQfEsWMmwO7alSx/HZwkBBSTI+fMTiIqlaEhfzCO05NNms7odjla+96oD4NuPiji4lorRFQqSXfgsTlxkfAqkyxrvaN2JMp6tyKLgZyISiXJDjxuTjxM0duw5YGBnIhKwa02mZ01wbddTzbOpJ3gh0BZVzDsBgM5ERWu05LDOKV8wSAe5zlVC/asWiGiwiWtNmn3Ppcb4uI8J6oSpejlanOZ2UlEFEewx9vpyoK+gVHXOefEu597vszL1YZhICeiXPnSGyL+a9tVm9iB0cHB1p/19wP//M/x7ueez3NGZloYyIkoFXHzyr4er2prMD/rLOCVV9rfb3ISeP554NOfNsEbMF+nplpTIXFKG/OckZkaVc39NTY2pkTUO5aWVAcGVE1INq+BAXM+SKT5Ovc1PGx+PjioeuaZ8e6X9PlLS43nDA+3XpPkXnkDsKKemMpATkRdGx4OD8xxr7XX20Ab935Jnx9Hu2BflLBAzqoVIupanPVRlpeBmRngxInoew0MhNeGh6230s36LFXCqhUiyky7vPLyMvDJT7YP4oAJ4jbXHfc5F1yQ7Ppew0BORB1xBzdfecUMTrrcQcTZWeDVV+Pfe20t/nory8vAyy+3nj/rrN6fmm8xkBPRa+JWngRLCE+cMF8HB/3royQt3bPvd8sKzz7bf23Yh8TrX1/8BJ68cBlbIgLQOqPRTl8HWgOir4Tw1VeBc881pYBBYUvT+og0etJ/+EPj/IkT/vaEfUi88EK85/UCDnYSEYBk0+STDi7aHHnc9Ipq/PZ0Or2/ijIb7BSRS0XkARH5jYg8ISIz3d6TiPKXZEZj0kkzk5PAd77TOmXeZ3g4WXuSrl/ei9LIkZ8GcJuqXg7gSgCfEZHLU7gvEUVIe4W+JMG5k+A5OWkGRZeWGsHaZ9u2ZO1Jsn55z/IVl3fzAvAjAO+KuoYTgoi6k8Xsw6SzIwcHG9cNDiZ/drtJPGWeYVkUhEwISrVqRURGALwVwH7Pz6ZEZEVEVo4fP57mY4l6mq/nncUKfb6e7Y03mnu6z7aDom5NuDsoGVfY4Kc9z552fKkNdorIuQD+E8AuVf1h1LUc7CSKJ2xt7KQzH9N89tln+yf2JB1cPOMMUy8e1N8PnD6duLnrQthgZyrlhyJyJoAfAFhuF8SJKL6wnnd/vz8IpjmTMezZYR8iSWvFfe2POk/h0qhaEQDfAnBEVXd33yQissKCY5KZj2k/O0zSD5GwAc+ogVDySyNHfjWATwC4TkQO1V/bUrgv0boXFhxtvjjL/HHYswcH0/kQYdlginwjoFm/WLVCFE/cyo0sll2NenZazyvrcrFlBa5HTlRNRW6EwEBbLmGBnFP0iSpuPU1RX++4HjlRj0prs+C0Z4pSfhjIiSoujc2CfTvbT00xmFcFAzlRxaVR/ZHFTFHKDwM5UcWlMZU9rfQMFYMbSxD1gMnJ7mrIwzZ+WC97XlYde+REFZXm4CQn51QbAzlRBaU9OMmVBquNgZyoguIMTob12MPOT06auvNazXxlEK8O5siJKqjd4GTYRsq//CVw113xNlim6mCPnKiC2tWOh/XY9+1jmWEvYiAnqiDf4CRg9sRcXo5e/taHZYbVxkBOVEF2cHJwsPn8iRMmVXLBBf739ff7z7PMsNoYyIkqanISOPfc1vOnTpmALtJ8fmDABHmWGfYeBnKiDOS1AFVUSkS1EcxtOeE3vlFsmSEX5sqIb23brF9cj5x6WSbrg9dq3uPh4ebn+F7Dw108ty6NdcmzXDd9vQDXIyfKR+rrg8/PAydPAnv2mG60KnDLLcDGjVi+bL5lp/sgEVMb3qlgKSNg0jFJe/JcN717ma5HLiLfFpHnRORwGvcjqrJUF6BSNUF8714TvG0Q37sXOHkSk3+tr6VKwgQHMpOmN9JaGZELc2XI101P+gLwFwDeBuBwnOuZWqFeFpbu6DjFUaupzsw032xmpiXdEid10Ul6Q8T/+4gk+zVS/3dZhxCSWkmlR66qDwF4IY17EVVd6gtQiZi0isumWRzt1ktZXgZuvDF57zqNjSsALsyVKV907+QFYAQRPXIAUwBWAKwMDQ3l8eFFVJhUNy2O2SNv155gTzxu7zrNQUpu5twdhPTIcwvk7oupFaKY3CBug3f9+Mj1Mzo8VIsVFNtVt7RLbzAAl0NYIOeiWURlJgJs3AjMzDTSKXv24OhR4Af/sRGrp016pd3iV1EDinHSG91uXEHZSq38UERGANyrqle0u5blh0QJqTblxEeGFavHpOWysFK+sNK//n6zGiKDdDVkXX74XQAPA3iziDwtIp9K475EVBcY2Dz2VGsQB8J73mEDjQzivSGV1IqqfiyN+xBRPEn32LTBenbWBPuhIRPcGcR7A9daIaqgTkr5uANQ72IgJyqb4LiVZxyLe2ySi4GcqAupr+Y3P9+Yig80puTPz7dcyh42WQzkRB1Keyd7aPS6Kr6eORGQYvlhEiw/pF6QyWp+bvC23BpyWtfCyg8ZyIk61Nfn7yR3u2wsVM3NrVqNQZwAZFxHTrQepbWYVBPbI3e5OXMiDwZyog6lvpqfm1aZmTE98ZmZ5pw5kQcDOVGHUi8BrK+rcvT6GYzcvQd9/YKRu/fg6PUzZr0VplcoBHPkRCWyvAxM/Z3i1B8aQXvgbMW+fxGWFxJz5ERVMDuLpiAOmOOk26rR+sJATlQi3NeSOsFATlQimVTCUM9jICcqEe5rSZ1gICfKUNK1WLgYFnWCW70RZcSuxWJ3rW+3HZvFbdUoKfbIiTIyO9sI4tapU2AFCqUura3etorIb0XkSRH5XBr3JCqtGOuFA6xAofx0HchFpB/A1wG8B8DlAD4mIpd3e1+i18QMnLlIsF44K1AoL2n0yN8O4ElV/Z2q/gnA9wBsT+G+RIkCZ6TgcoSdLE+YcL1wVqBQXtII5JcAeMo5frp+romITInIioisHD9+PIXHUs9La6OFa68FxsYawbtWM8fXXpusPSJmXXC7kFVfX2OBK8964axAodyoalcvAB8E8E3n+BMAvhb1nrGxMSWKpVZTnZlRNWHbvGZmzPk41tZUR0fN+0ZH/cedtMltT9y2pGRpSXV4WFXEfF1ayvXxVCAAK+qJqWn0yJ8BcKlzvLl+jqh7thfsSrJbTl8fcPAgMDoKHDoE9Pebr6Oj5rzdwCFuHr7g9cJT316OekIagfxRAJeJyJtE5CwAHwVwTwr3JUoncNpg7nKDeNw8fAnWC2dJI/l0HchV9TSAmwH8DMARAN9X1Se6vS9RaoHT5sRdNmeeJA9fXy+8KSduc+Y5rRfOkkby4XrkVG7z8yag2sBpA+3GjfEqV2wQd9MpwWORZBseqzafDx5nKJMNn6kyuPkyVVengdNed+21wEsvASsrJkdug/uGDcCDDzaurcCGx8Fp/4ApaWQ1zPrAjSWouoIBNU6AdfPeDz5ogvhtt5nzNmfuBvGKbHjMkkbyYSCn3uPLe992W3Pe261WqdiGx5OTJo1Sq5mvDOLE1Q8pf1nnmN2Sxb17G7lvX947bAAT4IbHVBnMkVO+uh28TCKY915baz52P0AKHMAkios5cipeWlPu4z4rmPd2p+kHa8U7ycMTlQQDOeUn4VolHQvmvdfWGjM7bTDP6gOEqABMrVD+8ij1m58HXnwRWFgw93brya20P0CIMsbUCpVDUaV+IsA73tF8jkGcegQDOeUnr1I/m4tfXGzcd+dO4M47m68raXkhUVIsP6T85FXqF1Z+CADT0ybd4k7JZ8+cKo45cspfXqV+wVy8DeJZlz0SZSQsR84eOeUvj1I/Xy4++Ez2xKlHMEdOvScsF+/mzAEGceoZ7JFT7+G0e1pnmCOn3sVp99RjWEdOycTdw7LMOO2e1omuArmIfEhEnhCRmoi0fEpQRcXdw7JKeuGDiShEtz3ywwA+AOChFNpCZZDnwlZ56cUPJiJHV4OdqnoEAIR/svaOJGt5V4H7wQSY38GtaGHenHpAKoOdIvIggH9Q1dARTBGZAjAFAENDQ2Orvh1kya+IQbuK7GEZi/tXhVXVDyZa1zoe7BSR+0XksOe1PUkDVHWfqo6r6vimTZuSvHV9KyItUKE9LGNx/8qwGMSph7QN5Kr6TlW9wvP6UR4NXNeKyFdnvbBVEYOOvfbBRBTACUFlVkS+OsvJNHlu82YFP5jcHDnAnjn1hK4CuYi8H8CdADYB+ImIHFLV61NpGRk2kLr53ayDz/x8cx4+jXVJihp05CxPWgc4s7PsemmgrsjfhbM8qQdwZmcV5bURQ16KHHTkLE/qYQzkZRaWFpiZqWZagIOORJngYGfZdZqvLlsqgYOORJlhIK+CpGmBIqpD2uGgI1FmGMh7jVsdotq8P+X0dHE9c9Xmvy7sV/bEibrGqpVepApcdRWwf3/j3PS0+Xr++fn3ysv4FwJRBbFqpUrSmP04MdF6bnGxuxmhnbSrF1dTJCoZplbKpl3vtdNBzMVF0yvvNJXRaa+611ZTJCoh9sjLpF3vdW6u/QJa9pwN3Emf7zvutlfNRauIMsVAXiZunfjevWYZWVuut3s38NJLjWBaqzUH01qtcY+NG/1B3M2ZB0WtshjVrrilkKwfJ8qOqub+GhsbU4pQq6maMGdetVrj/MxM889mZlTX1szXubnGddPTjZ/7joPPs/e1Pw8eR7Wr3e8S595E1BaAFfXEVPbIyyaq9ypieuau3buBW29tTnOImOoUt8e8sBA+IzROj9v+BeBrV5Rem51KVEa+6J71iz3yEFG91+npRs/b7RW7PXNfT9v9Pnjse757z7U1c35tTXXLlu561VFtI6JYENIjZ9VKmfh6rxs2ABdfDDzySGMQc3QUOOss4MCBxnu/+tXwaha34sT+LFhx4vtL4G1vA371K3P+sceAiy4yfwF0MiuTi1YRZYaBvEi+UsLg7MeTJ4FnnzUvwATxQ4da7zU+Dhw8aNIibqCem2u/DjjQPPsTMB8Yjz0G9Pc3nvGRjzS+91WiEFEhmCOPK6w0r1PtqkSARm7bBtcDB5qD+PQ0cPp0I7iPjbVWswDt89/uXwILC83PdJ+1caPJx7u/e9b7hxJRe758S9avSuTI3Rzu3JzJUQerR2yVSCf3TlLJEcxd25y5vW5tTXV0NDpnHqfixP39bJWLfe3Y0Vr5wuoTolwhJEfeVUAGcAeAowAeB3A3gI1x3lf6QD431whOblCbmEgvgIWVEvqCeDCo2sDqXru2Fh6ofc9yPwjsNVHPCwbzqDYTUSayCuTvBnBG/fuvAPhKnPeVOpD7ArUvsKURwNr1koPPnp5uPbYfNmEfCr7fZ2LC//65Of/P3Q+yqA8MIspUWCDvKkeuqj9X1dP1w0cAbO7mfqXgq6n2TXdPYzPiqLps1UY9+MQEsGOHeeaePaYtExMmZ23vE7YdHNBcCQM0FtSyMz2DOfWtW80zFhaa8/TXX29y5GFtJqJi+KJ7Jy8APwbw8TjXlrpHbgV7y2mmFNrlyG+/vfn+a2umN3zJJY168rU18/3EhOo117TOwKz3sJeWVIeHVQU1HR5WXVpS/18Zvpy6y61hZ46cqBDotI5cRO4HcLHnR7Oq+qP6NbMATgNYjrjPFIApABgaGkr8gZMrVbOet2txEdiyBdi+vbHmCdC+Z2571u4x0NpL3rPH/GzDhsb9VRsbQ9je8+Jic5sA01u29d3Aa39VLP+bYGoKOHUKAASrq8DUlPl+cmGh+V7B3yP4O/X1cYcforLyRfckLwA3AXgYwEDc95S6R+7LS9uccXCGZbuqFXfQ1N57YqIxaOrmp6+5pjlnHewxT0+bwcao6pWA4eHWywHV4aGYA61h/z5Rx0SUGWQ02LkVwG8AbEryvlIHctVGuWEwmNoArBoewHwLXPkGTW0AttfY8sGwAVYb4INROSKQivgCeU0XEGhXsJ0M1kSlFBbIu9rqTUSeBPBnAE7UTz2iqn/f7n2V2OrN/rv0OePBtVp0CiG4+UKtZibpBCfxAM1pDbtMrV38ysfut3nnna3n7aBkwMgIsLraeqs9G+ax8yannaqNmaAAt2UjKqmwrd66Tq108ip9j1y1fUlf1PXBnm67nnXYMrEXX2y+2gWr7Ouii/y9+4ClJdWBgea3Dgw4A57B9nPJWaJSAxfNSsD2QvfuNaV6tlzPDkACrZsY28E/1eYtzbZsMWuWWDt3tj7vllsaPXLXG95g1lhx3w8AH/5wY6Bx/37TFk+PfHLSfJ2dBY4dA4aGgF277PmQRay4LRtR9fiie9avSvTIg3ly+70d+PT1UO17gr1wm1vvJEce7I27MzrD/jroVicbSBBR5sAeeUJ2FULA9ETd3LWvh6oKvPhic+7bsj36hYVGGaHNa9se8KFDrRtBAK3bs0WVCKbB/jXiuuUW9siJSoyBPIqbbnADeadBTQR4+OHme9tgbgcWg/cNBnL7QREywBkpeH/fsTtL1F3yFmAwJyopLmPbTlgPNVjtY6fT+5Z/dXPYdtlY9/3tgvj0tKmAsfeO2kQ5TNSyuW47uC0bUeWwRx4laQ91bs4/mDk313wcLFO0z3FL/ETMmicTE81rngChg5uRv0e7zSXc3YTcY/cvBiIqJ1/iPOtXJQY7Ld/sTN+szrile52sRR51HFfcZXOJqLSQxYSgTlViQpCrXW7ZitPTtv/ebs8eyKfETzXZBCciKpWwCUEM5GmLCvrBTZDzDKpumshifThRpYQFcg52pi1st3g3T71zZ2sufefO1gHUtARz/cE1ywv4MCei9HCwMy/uzE+31txdeyWrgcWwahSA1ShEPYCplbz58tSAP5ceJy+f9Nlp35OIcsPUShmE1aQDpodsg3icmu9OhKV9iKjSGMjz0i5P7V5nc+k2mLt7ajKfTUQBzJHnJW6e2j3PFQiJKAbmyPMWN0/Nmm8iCmCOvCzi5Knjru9CRIReDuTBoFeVIMiabyJKqKscuYh8CcB2ADUAzwG4SVX/J42GdSXOVPmyYs03ESXU7WDnHar6jwAgItMAbgfQdvPlTCVZ6a+suAIhESXQVSBX1Zedw3MAFP93f5ZVH2lOqGl3L9Z8E1FMXVetiMguAH8D4CUAf6mqx0OumwIwBQBDQ0Njq6urXT03kv2d0qz6SDNdU+XUDxEVpuOqFRG5X0QOe17bAUBVZ1X1UgDLAG4Ou4+q7lPVcVUd37RpUze/S7T5ef+iVFdd1flAYZqTdDjhh4jS5lukvJMXgCEAh+Ncm/rGEu6mDe5O9Tt2tB77NlKIs3lDNxszBK9ZW+MmD0SUGLLYWEJELlPV/65/vwPANar6wXbvS3VCUDBNUasBl1wCPPts45rpaRMuDxww26e56YskaY5OJumE3X/DBuCLX0x2LyJa17KaEPTleprlcQDvBjDT5f2S8aUpbr21OYgDjSC6f39z+iJJmqOTSTpR97/nnmT3IiIK4+umZ/1KJbXi2wPTvkZHm4+D6Qs3hREnZZJ0n81gO8Pal+eenURUeQhJrVRzZqe7zKsIsHt3888PHQJGR4HTp5vPn3ee+eouCeuWK1rBMsWwSTozM+0n6fjuf8MN8e6V1XK2RNRTqrf6oZuuAEwQHxtrvubCC00wHw+kkn78Y/PeO+9sTA4C/CmTYDDvdJKOLyXz0kum3VH3Cv6eVZzYRET58HXTs351nVoJS1e41SCDg/70CmAqWWyKpdOUSdJ2dnL/bipliKjnIIuqlU6lUrUSrCBZWzPHqqZm/OmngWee8b/XrRDJenJOt/cP/p6sbiFat8KqVqrTIw8OPrr14cGBzODPwgY9fff2HXer0/uzR05EDlR6sNMd9FM1szYXF4GJiWTLvO7YYWrKg9dmva5JJ/e3PXcuZ0tEbZR/sNM36Ld/v/l+YqJxDjDpir4+4PzzTcBeXGzcZ8cO4IILgLm5RhVKmVMUXM6WiGKqRo7c7Z1a09PAwkIjoLlVHG6v3Xd9lSo+gm2tUtuJKFXV3urNV4vtBnF7DdAI+ouLzSmJxcXm2vOq4HK2RNRGNQK5rxY7LE/czeQdIqIKqkaO3B30cyfGAP5JOdxhh4jWkfIH8k4H/ZiSIKJ1ohqDnQAH/Yho3av2YCfAHjYRUYjqBHIiIvJiICciqjgGciKiimMgJyKquEKqVkTkOIDV3B8c34UAni+6EW1UoY0A25mmKrQRYDvTFGzjsKpuCl5USCAvOxFZ8ZX4lEkV2giwnWmqQhsBtjNNcdvI1AoRUcUxkBMRVRwDud++ohsQQxXaCLCdaapCGwG2M02x2sgcORFRxbFHTkRUcQzkREQVx0AeQkS+JCKPi8ghEfm5iPx50W0KEpE7RORovZ13i8jGotvkIyIfEpEnRKQmIqUq9xKRrSLyWxF5UkQ+V3R7fETk2yLynIgcLrotUUTkUhF5QER+U//fe6boNgWJyOtE5ICIPFZv4xeKblMUEekXkV+LyL1R1zGQh7tDVd+iqqMA7gVwe8Ht8bkPwBWq+hYA/wXg8wW3J8xhAB8A8FDRDXGJSD+ArwN4D4DLAXxMRC4vtlVe/wpga9GNiOE0gNtU9XIAVwL4TAn/Pf8I4DpV3QJgFMBWEbmy2CZFmgFwpN1FDOQhVPVl5/AcAKUbFVbVn6vq6frhIwA2F9meMKp6RFV/W3Q7PN4O4ElV/Z2q/gnA9wBsL7hNLVT1IQAvFN2OdlT1f1X1V/Xv/w8mAF1SbKuaqfFK/fDM+qt0/20DgIhsBvBeAN9sdy0DeQQR2SUiTwGYRDl75K6/BfDvRTeiYi4B8JRz/DRKFniqSkRGALwVwP6Cm9Kinq44BOA5APepaunaWLcA4LMAau0uXNeBXETuF5HDntd2AFDVWVW9FMAygJvL2Mb6NbMwf9YuF9HGuO2k9UFEzgXwAwA7A3/ZloKqrtVTppsBvF1Erii4SS1E5H0AnlPVg3GuL/+enRlS1XfGvHQZwE8BzGXYHK92bRSRmwC8D8BfaYGTAhL8W5bJMwAudY43189Rh0TkTJggvqyqPyy6PVFU9aSIPAAz/lC2geSrAdwgItsAvA7AeSKypKof9128rnvkUUTkMudwO4CjRbUljIhshfnT6wZVPVV0eyroUQCXicibROQsAB8FcE/BbaosEREA3wJwRFV3F90eHxHZZKu7RORsAO9CCf/bVtXPq+pmVR2B+f/lL8KCOMBAHuXL9dTA4wDeDTN6XDZfA/B6APfVyyT/qegG+YjI+0XkaQBXAfiJiPys6DYBQH2g+GYAP4MZmPu+qj5RbKtaich3ATwM4M0i8rSIfKroNoW4GsAnAFxX///joXqPskzeCOCB+n/Xj8LkyCNL+6qAU/SJiCqOPXIioopjICciqjgGciKiimMgJyKqOAZyIqKKYyAnIqo4BnIioor7f83uJy4wI5oeAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(X_0[:, 0], X_0[:, 1], marker='o', color='b')\n",
    "plt.scatter(X_1[:, 0], X_1[:, 1], marker='x', color='r')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "43582ec2-80e2-4642-93a7-c6306759b8bf",
   "metadata": {},
   "outputs": [],
   "source": [
    "W, W_rule = GD(X, Y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "7647ecd6-2c0b-4894-94c9-41204e067155",
   "metadata": {},
   "outputs": [],
   "source": [
    "t = np.arange(-5, 5, 0.01)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "1674e051-8a05-428e-b92f-661de7d1a7b4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(X_0[:, 0], X_0[:, 1], marker='o', color='b')\n",
    "plt.scatter(X_1[:, 0], X_1[:, 1], marker='x', color='r')\n",
    "plt.plot(t, - (W[0] + W[1] * t) / W[2])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "e2f4ed49-bfdd-4ca7-8236-b1e901689480",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(X_0[:, 0], X_0[:, 1], marker='o', color='b')\n",
    "plt.scatter(X_1[:, 0], X_1[:, 1], marker='x', color='r')\n",
    "plt.plot(t, - (W_rule[0] + W_rule[1] * t) / W_rule[2])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "11c41330-17c6-47fa-ba0c-ff68b286d806",
   "metadata": {},
   "outputs": [],
   "source": [
    "W, W_rule = Newton(X, Y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "4e42b9fb-021e-47bd-84f2-5094bf658a46",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(X_0[:, 0], X_0[:, 1], marker='o', color='b')\n",
    "plt.scatter(X_1[:, 0], X_1[:, 1], marker='x', color='r')\n",
    "plt.plot(t, - (W[0, 0] + W[1, 0] * t) / W[2, 0])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "fcd291a9-58f4-4fe8-b915-88c6fbaeb9b0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(X_0[:, 0], X_0[:, 1], marker='o', color='b')\n",
    "plt.scatter(X_1[:, 0], X_1[:, 1], marker='x', color='r')\n",
    "plt.plot(t, - (W_rule[0] + W_rule[1] * t) / W_rule[2])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "7f2ffafb-9404-45a4-bc3f-0c2518e76b90",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import random"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "471f406d-6c81-4772-93ee-97e15e671ab1",
   "metadata": {},
   "outputs": [],
   "source": [
    "#datapath = 'winequality-red.csv'\n",
    "datapath = 'Rice_Osmancik_Cammeo_Dataset.csv'\n",
    "data = pd.read_csv(datapath)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "35ba8e39-cad8-43cf-a80c-73667bc0f238",
   "metadata": {},
   "outputs": [],
   "source": [
    "attributes = data.columns\n",
    "Y = list(data[attributes[-1]])\n",
    "for i in range(len(Y)):\n",
    "     Y[i] = 1 if Y[i] == 'Cammeo' else 0\n",
    "Y = np.array(Y)\n",
    "Y = Y.reshape((len(Y), 1))\n",
    "Y = (Y > 5) * 1\n",
    "attributes = attributes[:-1]\n",
    "X = np.ones((len(Y), 1))\n",
    "for attribute in attributes:\n",
    "    X = np.hstack([X, np.array(data[attribute]).reshape(len(Y), 1)])\n",
    "test_num = list(random.sample(list(range(0, Y.shape[0])), int(0.2 * Y.shape[0])))\n",
    "train_num = list(set(range(0, Y.shape[0])) - set(test_num))\n",
    "X_train = X[train_num]\n",
    "Y_train = Y[train_num]\n",
    "X_test = X[test_num]\n",
    "Y_test = Y[test_num]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "8d2ea966-e2e6-447a-adf5-537a84bc9e75",
   "metadata": {},
   "outputs": [],
   "source": [
    "W, W_rule = GD(X_train, Y_train, echos=1000000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "5493c77e-75a4-4c22-9dbd-15291175562e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.0\n"
     ]
    }
   ],
   "source": [
    "Y_hat_test = sigmoid(X_test.dot(W)) > 0.5\n",
    "print(np.average(Y_test == Y_hat_test))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "0b0f7cae-b10b-4cd3-b24a-3352db4d2605",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.0\n"
     ]
    }
   ],
   "source": [
    "Y_hat_test = sigmoid(X_test.dot(W_rule)) > 0.5\n",
    "print(np.average(Y_test == Y_hat_test))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e8fb06ef-e2fc-4e09-b12f-7eb9f14765a3",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
